home *** CD-ROM | disk | FTP | other *** search
/ 10,000 Great Games / 10,000 Great Games.iso / Product / 66 / data1.cab / Source_Files / Src / SShot.cpp < prev    next >
C/C++ Source or Header  |  2000-01-16  |  2KB  |  85 lines

  1. #include "stdafx.h"
  2.  
  3. void make_screenshot()
  4. {    
  5.     static int screenshot_number = 1;
  6.  
  7.     // We don't make screen shots in a window
  8.  
  9.     if (inawin)
  10.         return;
  11.  
  12.     // Lock surface
  13.     
  14.     DDSURFACEDESC2 srcsurf;
  15.     srcsurf.dwSize = sizeof(srcsurf);    
  16.     
  17.     while (!draw_ok(screen->Lock(0, &srcsurf, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, 0)));
  18.                 
  19.     // Get pointers
  20.         
  21.     BYTE *s = (BYTE *)srcsurf.lpSurface, d[SCREEN_X * SCREEN_Y];
  22.     
  23.     // Copy the image (bottom up)
  24.  
  25.     for (int y = 0; y < SCREEN_Y; y++)
  26.         CopyMemory(&d[(SCREEN_Y - 1 - y) * SCREEN_X], &s[y * srcsurf.lPitch], SCREEN_X);
  27.         
  28.     // Unlock the surface
  29.  
  30.     screen->Unlock(0);
  31.  
  32.     // Allocate memory for header
  33.  
  34.     BITMAPFILEHEADER bfh;
  35.     BITMAPINFOHEADER bih;    
  36.     BYTE pal[4 * 256];
  37.  
  38.     // Construct bitmap file header
  39.  
  40.     ZeroMemory(&bfh, sizeof(bfh));
  41.  
  42.     bfh.bfType = 0x4d42;
  43.     bfh.bfOffBits = sizeof(bfh) + sizeof(bih) + sizeof(pal);
  44.     bfh.bfSize = bfh.bfOffBits + sizeof(d);
  45.  
  46.     // Construct bitmap info header
  47.     
  48.     ZeroMemory(&bih, sizeof(bih));
  49.     
  50.     bih.biSize = sizeof(bih);
  51.     bih.biWidth = SCREEN_X;
  52.     bih.biHeight = SCREEN_Y;
  53.     bih.biPlanes = 1;
  54.     bih.biBitCount = 8;
  55.     bih.biCompression = BI_RGB;
  56.     bih.biSizeImage = bfh.bfSize;
  57.     bih.biClrUsed = 256;
  58.     bih.biClrImportant = 256;
  59.  
  60.     // Construct palette    
  61.     
  62.     for (int i = 0; i < 256; i++)
  63.     {
  64.         pal[4 * i] = rgb_table[i].peBlue;
  65.         pal[4 * i + 1] = rgb_table[i].peGreen;
  66.         pal[4 * i + 2] = rgb_table[i].peRed;
  67.         pal[4 * i + 3] = 0;
  68.     }        
  69.  
  70.     // Write stuff to file
  71.  
  72.     TRY
  73.     {
  74.         CFile f(construct("screen%03d.bmp", screenshot_number++), CFile::modeCreate | CFile::modeWrite | CFile::shareExclusive);
  75.         
  76.         f.Write(&bfh, sizeof(bfh));
  77.         f.Write(&bih, sizeof(bih));
  78.         f.Write(&pal, sizeof(pal));
  79.         f.Write(&d, sizeof(d));
  80.     }
  81.     CATCH(CFileException, e)
  82.     {
  83.     }
  84.     END_CATCH
  85. }